#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/wait.h>

void ChildRun()
{
  //int* p=NULL;
  int cnt=5;
  while(cnt--)
  { 
    printf("I am child process,pid=%d,ppid=%d,cnt=%d\n",getpid(),getppid(),cnt);
    sleep(1);
    //*p=100;
  }
}

int main()
{
  printf("I am parent process,pid=%d,ppid=%d\n",getpid(),getppid());

  pid_t id=fork();
  if(id==0)
  {
    //child
    ChildRun();
    printf("child process quit.....\n");
    exit(123);
  }
  //parent
  while(1)
  {
    int status=0;
    pid_t rid=waitpid(id,&status,WNOHANG);
    if(rid==0)//检测是成功的，但是进程还没有退出，需要下一次进行重复等待
    {
      printf("child process is running,parnet process check next time\n");
      //DoOtherThing();
      sleep(1);
    }
    else if(rid>0)//等待成功，子进程退出，父进程回收成功
    {
      if(WIFEXITED(status))
      {
        printf("child process quit success,quit_code=%d\n",WEXITSTATUS(status));
      }
      else 
      {
        printf("child quit normally\n");
      }
      break;
    }
    else//等待失败 
    {
      printf("waitpid fail\n");
      break;
    }
  }






  ////parent
  ////sleep(8);
  //int status=0;
  //pid_t rid=waitpid(id,&status,0);
  //if(rid>0)
  //{
  //  if(WIFEXITED(status))
  //  {
  //    printf("child quit sucess,child exit_code=%d\n",WEXITSTATUS(status));
  //  }
  //  else 
  //  {
  //    printf("child quit unnormally\n");
  //  }
  //  printf("wait success......\n");
  //}
  //sleep(3);
  //printf("parent process quit,status=%d,child exit_code=%d,child exit_signal=%d\n",status,(status>>8)&0xFF,status&0x7F);

  //return 0;
}


//int main()
//{
//  pid_t id=fork();
//  if(id==-1)
//  {
//    printf("fork fail\n");
//    return 1;
//  }
//  else if(id==0)
//  {
//    //child
//    while(1)
//    {
//      printf("I am child process,pid=%d,ppid=%d\n",getpid(),getppid());
//      sleep(1);
//    }
//  }
//  else 
//  {
//    //parent
//    int cnt=3;
//    while(cnt--)
//    {
//      printf("I am parent process,pid=%d,ppid=%d\n",getpid(),getppid());
//      sleep(3);
//    }
//  }
//
//  return 0;
//}
//


//int main()
//{
//  printf("hello world");
//  sleep(2);
//
//  _exit(123);
//}
//

//enum 
//{
//  Success=0,
//  Div_Zero
//};
//
//int exit_code=Success;
//
//int Div(int x,int y)
//{
//  if(0==y)
//  {
//    exit_code=Div_Zero;
//    return -1;
//  }
//  else 
//    _exit(31);
//}
//
//int main()
//{
//  int result=Div(10,100);
//  printf("result=%d\n",result);
//
//  return exit_code;
//
//
//  //int* p=NULL;
////  while(1)
////  {
////    printf("I am a process,pid=%d,ppid=%d\n",getpid(),getppid());
////    sleep(1);
////    //exit(123);
////    //*p=1;
////  }
////
//
//
//
//
////  int errcode=0;
////  for(errcode=0;errcode<=255;errcode++)
////  {
////    printf("%d:%s\n",errcode,strerror(errcode));
////  }
////
//
//
//  //printf("I am a process,pid=%d,ppid=%d\n",getpid(),getppid());
//
//  return 0;
//}
